הסבר איך ליצור סביבת פיתוח אישית שעובדת על בסיס MVC.
בחלק הקודם הסברתי איך להתחיל את הפיתוח של סביבת העבודה האישית שתעבוד על MVC, ההסבר היה על קובץ ההפעלה והוא הריץ לנו קונטרולייר שבנינו.
אם לא קראתם את החלק הראשון לחץ כאן
בחלק הקודם שככתי להוסיף הסבר על ה htaccess
אז בתיקיה הראשית ניצור קובץ בשם: .htaccess
ובוא נוסיף את השורות קוד הבאות:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
משזה יעשה אם נכנסתם לדף הוא מעביר את זה לתיקיה אם התיקיה לא קיימת והקובץ לא קיים זה מעביר לתוך הindex.php?url=[את הפניה בדפדפן]
כאן אני יתמקד בשני קבצים חשובים שנמצאים תחת תיקיה:library
הקבצים: Controller.php , View.php
Controller.php זהו קובץ שמכיל מחלקה שתיתן כלים למפתח אם זה שליטה על תצוגה או בדיקת הקוד וכו.
View.php זהו קובץ שאחרי על כל התצוגה אם זה לבצע render או להפעיל layout או לעביר בין דפים שונים באתר הכל כאן.
Controller.php
<?php
class Framework_Controller {
* @param Framework_View $view this object use the view system
*/
public $view;
/*
* construct function
*/
function __construct() {
$this->view = new Framework_View(); //start to use view
$this->view->controller =
str_replace("Controller", null, get_called_class()); //use the controller name in view
}
class Framework_Controller {
* @param Framework_View $view this object use the view system
*/
public $view;
/*
* construct function
*/
function __construct() {
$this->view = new Framework_View(); //start to use view
$this->view->controller =
str_replace("Controller", null, get_called_class()); //use the controller name in view
}
טיפ: את הFramework תחליפו בשם של הפריימוורק שלכם אצלי לדוגמה זה Sidox
אוקיי זהו קובץ ממש פשוט הוא מבצע הפעלה למחלקת הFramework_View ומכניס אותה במשתנה view
והוא בעצם לוקח את שם המחלקה שהריצה אותו ומוריד את המילה Controller מימנה.
רעיונות לשיפור המחלקה:
ליצור כלים למתכנת לדוגמה כלי שמאפשר לבדוק יעלות של קוד (כמה זמן לוקח הביצוע) ריבוי אקשינים לצור פונקציה שמקבלת מערך ופונקציה שמחזירה אותו ובפונקציה שמחזירה מגדירה שמות של אקשניים ומשתנים שהם מקבלים וזה שולך את זה למחלקה חדשה בתת תיקיה של שם הקונטרולייר לדוגמה:
//its main controller
public function actions{
return array(
"page" => array($vars)
);
}
public function actions{
return array(
"page" => array($vars)
);
}
ואז זה פותח את הקובץ:
aplication/controllers/main/page.php
ובתוך page יש מחלקת page
טוב אז עכשיו נתתי כמה דוגמאות לשדרוג המחלקה עכשיו פשוט תהיו יצרתיים נעבור לתצוגה
View.php
<?php
class Framework_View {
/*
* @param array(string) $_data data for loaded pages
*/
private $_data = array();
/*
* set data in $_data array
* @param (string) $name its a key
* @param (string) $value its a data
*/
function __set($name, $value) {
$this->_data[$name] = $value; //set the data in array
}
/*
* get data from array
* @param $name its a key of array
* @return the value
*/
function __get($name) {
return $this->_data[$name]; //get the data from array
}
/*
* render the page
* @param (string) $name is name of file
* @param array(string) $data data are using in file
*/
public function render($name, array $data = array()) {
extract($data); //extract array to vars
require APPLICATION . 'views'
. DS . $this->controller . DS . $name . ".phtml"; //require the file
}
/*
* redirect to url
* @param (string) $redirectTo url or commend to redirect
* commends:
* 1)start on http:// will be redircecting to url
* 2)commend back goto last page in your site
* 3)commend comeback or -1 come back to referer site
* 4)commend refresh come back to this page
* @param array(string) $redirectTo array(Controller,Action)
* @else commend Controller/Action come to your controller and run action
* if action not set run only controller
* @param int $time its time to sleep
*/
public function redirect($redirectTo, int $time = 0) {
if (stristr($redirectTo, 'http://')) {
/*
* @param $redirectTo has http://
*/
header('Refresh:' . $time . '; URL=' . $redirectTo);
} elseif ($redirectTo == 'back') {
if ((isset($_SERVER['HTTP_REFERER'])) &&
(stristr($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']))) {
/*
* @param $redirectTo Equal back
* if referer is your site go to referer
*/
header('Refresh:' . $time . '; URL=' . $redirectTo);
}
} elseif (($redirectTo == 'comeback') || ($redirectTo == -1)) {
if (isset($_SERVER['HTTP_REFERER'])) {
/*
* @param $redirectTo Equal comback or -1
* goto referer
*/
header('Refresh:' . $time . '; URL=' . $redirectTo);
}
} elseif (is_array($redirectTo)) {
/*
* @param array(string) $redirectTo
*/
if (isset($redirectTo[1])) {
/*
* @param string $redirectTo[1] is set
* goto Controller/Action
*/
header('Refresh:' . $time . '; URL=' . $_SERVER[SERVER_NAME]
. pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME)
. '/' . $redirectTo[0] . "/" . $redirectTo[1]);
} else {
/*
* @param string $redirectTo[1] is not set
* goto Controller
*/
header('Refresh:' . $time . '; URL=' . $_SERVER[SERVER_NAME]
. pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME)
. '/' . $redirectTo[0]);
}
} elseif ($redirectTo == 'refresh') {
/*
* @param $redirectTo Equal refresh
* refresh the page
*/
header('Refresh:' . $time . '; URL=' . $_SERVER[SERVER_NAME] . $_SERVER['REQUEST_URI']);
} else {
/*
* @param $redirectTo is Controller/Action
* or
* @param $redirectTo is Controller
* goto local page
*/
header('Refresh:' . $time . '; URL=' . $_SERVER[SERVER_NAME]
. pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME)
. '/' . $redirectTo);
}
}
}
class Framework_View {
/*
* @param array(string) $_data data for loaded pages
*/
private $_data = array();
/*
* set data in $_data array
* @param (string) $name its a key
* @param (string) $value its a data
*/
function __set($name, $value) {
$this->_data[$name] = $value; //set the data in array
}
/*
* get data from array
* @param $name its a key of array
* @return the value
*/
function __get($name) {
return $this->_data[$name]; //get the data from array
}
/*
* render the page
* @param (string) $name is name of file
* @param array(string) $data data are using in file
*/
public function render($name, array $data = array()) {
extract($data); //extract array to vars
require APPLICATION . 'views'
. DS . $this->controller . DS . $name . ".phtml"; //require the file
}
/*
* redirect to url
* @param (string) $redirectTo url or commend to redirect
* commends:
* 1)start on http:// will be redircecting to url
* 2)commend back goto last page in your site
* 3)commend comeback or -1 come back to referer site
* 4)commend refresh come back to this page
* @param array(string) $redirectTo array(Controller,Action)
* @else commend Controller/Action come to your controller and run action
* if action not set run only controller
* @param int $time its time to sleep
*/
public function redirect($redirectTo, int $time = 0) {
if (stristr($redirectTo, 'http://')) {
/*
* @param $redirectTo has http://
*/
header('Refresh:' . $time . '; URL=' . $redirectTo);
} elseif ($redirectTo == 'back') {
if ((isset($_SERVER['HTTP_REFERER'])) &&
(stristr($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']))) {
/*
* @param $redirectTo Equal back
* if referer is your site go to referer
*/
header('Refresh:' . $time . '; URL=' . $redirectTo);
}
} elseif (($redirectTo == 'comeback') || ($redirectTo == -1)) {
if (isset($_SERVER['HTTP_REFERER'])) {
/*
* @param $redirectTo Equal comback or -1
* goto referer
*/
header('Refresh:' . $time . '; URL=' . $redirectTo);
}
} elseif (is_array($redirectTo)) {
/*
* @param array(string) $redirectTo
*/
if (isset($redirectTo[1])) {
/*
* @param string $redirectTo[1] is set
* goto Controller/Action
*/
header('Refresh:' . $time . '; URL=' . $_SERVER[SERVER_NAME]
. pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME)
. '/' . $redirectTo[0] . "/" . $redirectTo[1]);
} else {
/*
* @param string $redirectTo[1] is not set
* goto Controller
*/
header('Refresh:' . $time . '; URL=' . $_SERVER[SERVER_NAME]
. pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME)
. '/' . $redirectTo[0]);
}
} elseif ($redirectTo == 'refresh') {
/*
* @param $redirectTo Equal refresh
* refresh the page
*/
header('Refresh:' . $time . '; URL=' . $_SERVER[SERVER_NAME] . $_SERVER['REQUEST_URI']);
} else {
/*
* @param $redirectTo is Controller/Action
* or
* @param $redirectTo is Controller
* goto local page
*/
header('Refresh:' . $time . '; URL=' . $_SERVER[SERVER_NAME]
. pathinfo($_SERVER['REQUEST_URI'], PATHINFO_DIRNAME)
. '/' . $redirectTo);
}
}
}
מחלקת הView בעלת 4 תכונות אצלנו:
השמה נתונים למערך $_data
קבלת נתונים ממערך $_data
דוגמה לשימוש:
$this->view->yourdatakey = 'your data';
echo $this->view->yourdatakey;
echo $this->view->yourdatakey;
כמובן שהשימוש בוא היה בתוך הקונטרולליר או בתוך הקבצי תצוגה
render - שמוסיף את תוכן התצוגה שלנו בעצם דף שכולו HTML ובתוכו יש משתנים שהגדרנו או בהשמה את בrender עצמו
דוגמה לשימוש:
$this->view->render('main',array('titile'=>'main page','body'=>'this is my main page'));
כידי להשתמש במשתנים צריך פשוט להתייחס לKEY כמשתנה לדוגמה $title
redirect-מעבר מדף לדף אחר
נסביר בקצרה פשוט בתוך הקוד חפרתי מספיק על השימוש בוא:
$this->view->redirect('http://google.co.il',2);
אוקיי אז בוא ניראה מה יש לנו עד עכשיו
יצרנו את מערכת התיקיות כפי שאתם זוכרים:
מתוכם יצרנו את הקבצים הבאים:
index.php
.htaccess
/library/
|-Bootstrap.php
|-/framework/
|-Controller.php
|-View.php
.htaccess
/library/
|-Bootstrap.php
|-/framework/
|-Controller.php
|-View.php
עכשיו ניצור עוד כמה תיקיות
בתיקיה הראשית איפו שהlibrary והindex.php ניצור:
public-שם תכניסו את הקבצים שנגישים למשתמש לדוגמה
public/css/main.css - זה היה הנתיב של קובץ הCSS וככה כנ"ל אם תמונות וJS וכו'
appliction-זאת התיקיה של האפליקציה
בתוכנה ניצור שתי תיקיות
controllers-התיקיה של הקונטרוליירים שניצור
views-התיקיה של קבצי התצוגה שניצור
אז בוא ניצור דוגמה לבדיקת המערכת:
ניצור קובץ נוסף בתיקיה appliction/controller שעכשיו יצרנו וניקרא לו MainController.php
ניצור תיקיה נוספת בתיקיה appliction/views שעכשיו יצרנו וניקרא לו Main
ובתוכה ניצור קובץ נוסף demo.phtml
נפתח לעריכה את הקבצים :
בתיקיה:appliction/controllers/
קובץ:MainController.php
class MainController extends Framework_Controller
{
public function MainAction()
{
$this->view->render('demo',array('title'=>'this is demo page','body'=>'this is demo.phtml page');
$this->view->render('demo',array('title'=>'main action','body'=>'this is my main action');
echo "this is my test action";
echo 'we redirect in 5 sec';
$this->view->redirect('main/test',5);
}
public function TestAction() {
echo "this is my test action";
$this->view->render('demo',array('title' = > 'test page';'body'=>'this my test page'));
}
}
{
public function MainAction()
{
$this->view->render('demo',array('title'=>'this is demo page','body'=>'this is demo.phtml page');
$this->view->render('demo',array('title'=>'main action','body'=>'this is my main action');
echo "this is my test action";
echo 'we redirect in 5 sec';
$this->view->redirect('main/test',5);
}
public function TestAction() {
echo "this is my test action";
$this->view->render('demo',array('title' = > 'test page';'body'=>'this my test page'));
}
}
בתיקיה:appliction/views/main/
קובץ:demo.phtml
title: <?= $title ?> <br />
body:<br /> <?= $body ?> <br />
body:<br /> <?= $body ?> <br />
טוב לפני שנסיים ניראה איזה קבצים יש לנו:
index.php
.htaccess
/library/
|-Bootstrap.php
|-/framework/
|-Controller.php
|-View.php
/appliction/
|-/controllers/
|-MainController.php
|-/views/
|-/main/
|-demo.phtml
.htaccess
/library/
|-Bootstrap.php
|-/framework/
|-Controller.php
|-View.php
/appliction/
|-/controllers/
|-MainController.php
|-/views/
|-/main/
|-demo.phtml
רעיון למחשבה:
לא הכי נח לעשות רנדור בתחילת כל דף וגם בסיומו כידי לקבל מראה קבוע לאתר
תחשבו על דרך לעשות מעטפת שתיתן לדף LAYOUT קבוע ואם נירצה גם נוכל לשנות אותה בקלוט
טוב בחלק הבא אני יגע במודל ומה השימושים שלו ונבנה גם בסיס למודל שלכם
תגובות לכתבה:
אהבתי מאוד ! מחכה למדריכים הבאים ! :)
נחמד מאוד :)
אבל יש הרבה מוכנים אז בשביל מה להכין חדש?
אבל יכול מאוד לעזור לידע בPHP
בעיה. ה-htaccess לא עובד.
ושאלה, נגיד ופתרתי את הבעיה של ה-htaccess והוא עובד, איך הוא יבוא לידי ביטוי?
אם אני רוצה לגשת לקונטרולר MainController למטודה Main - זה הכתובת: matan.co.il/Main/Main ?